home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / Libraries / Dots & Pixels / sources / screendots.cp < prev    next >
Text File  |  1995-09-29  |  5KB  |  202 lines

  1. #include <QuickDraw.h>
  2.  
  3. #include "C_randomizer.h"
  4. #include "screenarea.h"
  5. #include "screendots.h"
  6.  
  7. void screendots::init( int aantaldots)
  8. {
  9.     numdots = aantaldots;
  10.     current_intensity = 0;
  11.  
  12.     dot_addresses     = new unsigned char *[ numdots];
  13.     old_dot_addresses = new unsigned char *[ numdots];
  14.     
  15.     for( int i = 0; i < numdots; i++)
  16.     {
  17.         dot_addresses[ i]     = waste_area;
  18.         old_dot_addresses[ i] = waste_area;
  19.     }
  20. }
  21.  
  22. void screendots::make_a_move( const unsigned char diff)
  23. {
  24.     compute_addresses();
  25.     MoveDots( diff);
  26.     swap();
  27. }
  28.  
  29. void screendots::make_a_multimove(
  30.         const int *offsets, int numoffsets, const unsigned char diff)
  31. {
  32.     compute_addresses();
  33.     MoveMultiDots( offsets, numoffsets, diff);
  34.     swap();
  35. }
  36.  
  37. void screendots::make_a_stereo_move( const char disparity)
  38. {
  39.     compute_addresses();
  40.     MoveStereoDots( disparity);
  41.     swap();
  42. }
  43.  
  44. void screendots::EraseDots()
  45. {
  46.     unsigned char **the_dots = old_dot_addresses;
  47.  
  48.     const unsigned char intensity = current_intensity;
  49.     const int limit = numdots;
  50.     for( int i = 0; i < limit; i++)
  51.     {
  52.         **the_dots++ -= intensity;
  53.     }
  54.     current_intensity = 0;
  55. }
  56.  
  57. void screendots::EraseMultiDots( const int *offsets, int numoffsets)
  58. {
  59.     unsigned char **the_dots = old_dot_addresses;
  60.  
  61.     const unsigned char intensity = current_intensity;
  62.     const int limit = numdots;
  63.     for( int i = 0; i < limit; i++)
  64.     {
  65.         unsigned char *centerdot = *the_dots++;
  66.         const int *curoffset = offsets;
  67.         for( int j = 0; j < numoffsets; j++)
  68.         {
  69.             centerdot[ *curoffset++] -= intensity;
  70.         }
  71.     }
  72.     current_intensity = 0;
  73. }
  74.  
  75. void screendots::EraseStereoDots()
  76. {
  77.     unsigned char **the_dots = old_dot_addresses;
  78.  
  79.     const int right_disparity = current_disparity / 2;
  80.     const int left_disparity  = right_disparity - current_disparity;
  81.  
  82.     const int limit = numdots;
  83.     for( int i = 0; i < limit; i++)
  84.     {
  85.         (*the_dots)[ left_disparity]  += 1;
  86.         (*the_dots)[ right_disparity] += 8;
  87.         the_dots += 1;
  88.     }
  89.     current_disparity = 0;
  90. }
  91.  
  92. void screendots::SetDots( const unsigned char diff)
  93. {
  94.     unsigned char **the_dots = dot_addresses;
  95.     const int limit = numdots;
  96.  
  97.     for( int i = 0; i < limit; i++)
  98.     {
  99.         **the_dots++ += diff;
  100.     }
  101.     current_intensity = diff;
  102. }
  103.  
  104. void screendots::SetMultiDots(
  105.         const int *offsets, int numoffsets, const unsigned char diff)
  106. {
  107.     unsigned char **the_dots = dot_addresses;
  108.  
  109.     const int limit = numdots;
  110.     for( int i = 0; i < limit; i++)
  111.     {
  112.         unsigned char *centerdot = *the_dots++;
  113.         const int *curoffset = offsets;
  114.         for( int j = 0; j < numoffsets; j++)
  115.         {
  116.             centerdot[ *curoffset++] += diff;
  117.         }
  118.     }
  119.     current_intensity = diff;
  120. }
  121.  
  122. void screendots::SetStereoDots( const char disparity)
  123. {
  124.     unsigned char **the_dots = dot_addresses;
  125.  
  126.     const int right_disparity = disparity / 2;
  127.     const int left_disparity  = right_disparity - disparity;
  128.  
  129.     const int limit = numdots;
  130.     for( int i = 0; i < limit; i++)
  131.     {
  132.         (*the_dots)[ left_disparity]  -= 1;
  133.         (*the_dots)[ right_disparity] -= 8;
  134.         the_dots += 1;
  135.     }
  136.     current_disparity = disparity;
  137. }
  138.  
  139. void screendots::MoveDots( const unsigned char diff)
  140. {
  141.     unsigned char **old_dots = old_dot_addresses;
  142.     unsigned char **new_dots = dot_addresses;
  143.     const unsigned char intensity = current_intensity;
  144.     const int limit = numdots;
  145.     
  146.     for( int i = 0; i < limit; i++)
  147.     {
  148.         **old_dots++ -= intensity;
  149.         **new_dots++ += diff;
  150.     }
  151.     current_intensity = diff;
  152. }
  153.  
  154. void screendots::MoveMultiDots(
  155.         const int *offsets, int numoffsets, const unsigned char diff)
  156. {
  157.     unsigned char **old_dots = old_dot_addresses;
  158.     unsigned char **new_dots = dot_addresses;
  159.     const unsigned char intensity = current_intensity;
  160.     const int limit = numdots;
  161.  
  162.     for( int i = 0; i < limit; i++)
  163.     {
  164.         unsigned char *old_centerdot = *old_dots;
  165.         unsigned char *new_centerdot = *new_dots;
  166.         
  167.         for( int j = 0; j < numoffsets; j++)
  168.         {
  169.             const int curoffset = offsets[ j];
  170.             old_centerdot[ curoffset] -= intensity;
  171.             new_centerdot[ curoffset] += diff;
  172.         }
  173.         old_dots += 1;
  174.         new_dots += 1;
  175.     }
  176.     current_intensity = diff;
  177. }
  178.  
  179. void screendots::MoveStereoDots( const char disparity)
  180. {
  181.     unsigned char **old_dots = old_dot_addresses;
  182.     unsigned char **new_dots = dot_addresses;
  183.  
  184.     const int old_right_disparity = current_disparity / 2;
  185.     const int old_left_disparity  = old_right_disparity - current_disparity;
  186.  
  187.     const int new_right_disparity = disparity / 2;
  188.     const int new_left_disparity  = new_right_disparity - disparity;
  189.  
  190.     const int limit = numdots;
  191.     for( int i = 0; i < limit; i++)
  192.     {
  193.         (*old_dots)[ old_left_disparity]  += 1;
  194.         (*old_dots)[ old_right_disparity] += 8;
  195.         (*new_dots)[ new_left_disparity]  -= 1;
  196.         (*new_dots)[ new_right_disparity] -= 8;
  197.         old_dots += 1;
  198.         new_dots += 1;
  199.     }
  200.     current_disparity = disparity;
  201. }
  202.